μλ°μ€ν¬λ¦½νΈ μ΄λ²€νΈ 루ν, νμ€ν¬ ν, λ§μ΄ν¬λ‘νμ€ν¬ νλ₯Ό μ¬μΈ΅ νꡬνλ©° μ±κΈ μ€λ λ νκ²½μμ μλ°μ€ν¬λ¦½νΈκ° λμμ±κ³Ό μλ΅μ±μ λ¬μ±νλ λ°©λ²μ μ€λͺ ν©λλ€. μ€μ©μ μΈ μμ μ λͺ¨λ² μ¬λ‘λ₯Ό ν¬ν¨ν©λλ€.
μλ°μ€ν¬λ¦½νΈ μ΄λ²€νΈ 루ν μ¬μΈ΅ λΆμ: νμ€ν¬ ν λ° λ§μ΄ν¬λ‘νμ€ν¬ κ΄λ¦¬ μ΄ν΄
μλ°μ€ν¬λ¦½νΈλ μ±κΈ μ€λ λ μΈμ΄μμλ λΆκ΅¬νκ³ λμμ± λ° λΉλκΈ° μμ μ ν¨μ¨μ μΌλ‘ μ²λ¦¬ν©λλ€. μ΄λ μ΄λ²€νΈ 루ν λλΆμ κ°λ₯ν©λλ€. μ΄λ²€νΈ 루νκ° μ΄λ»κ² μλνλμ§ μ΄ν΄νλ κ²μ μ±λ₯μ΄ λ°μ΄λκ³ λ°μμ±μ΄ μ’μ μ ν리μΌμ΄μ μ μμ±νλ €λ λͺ¨λ μλ°μ€ν¬λ¦½νΈ κ°λ°μμκ² μ€μν©λλ€. μ΄ ν¬κ΄μ μΈ κ°μ΄λμμλ νμ€ν¬ ν(μ½λ°± νλΌκ³ λ ν¨)μ λ§μ΄ν¬λ‘νμ€ν¬ νμ μ΄μ μ λ§μΆ° μ΄λ²€νΈ 루νμ 볡μ‘ν λ΄μ©μ μ΄ν΄λ³΄κ² μ΅λλ€.
μλ°μ€ν¬λ¦½νΈ μ΄λ²€νΈ 루νλ 무μμΈκ°μ?
μ΄λ²€νΈ 루νλ νΈμΆ μ€νκ³Ό νμ€ν¬ νλ₯Ό λͺ¨λν°λ§νλ μ§μμ μΌλ‘ μ€νλλ νλ‘μΈμ€μ λλ€. μ£Όμ κΈ°λ₯μ νΈμΆ μ€νμ΄ λΉμ΄ μλμ§ νμΈνλ κ²μ λλ€. λΉμ΄ μλ€λ©΄ μ΄λ²€νΈ 루νλ νμ€ν¬ νμμ 첫 λ²μ§Έ μμ μ κ°μ Έμ μ€νμ μν΄ νΈμΆ μ€νμ νΈμν©λλ€. μ΄ κ³Όμ μ 무νν λ°λ³΅λμ΄ μλ°μ€ν¬λ¦½νΈκ° μ¬λ¬ μμ μ λμμ μ²λ¦¬νλ κ²μ²λΌ 보μ΄κ² ν©λλ€.
μ΄λ λμμμ΄ λ κ°μ§λ₯Ό νμΈνλ μ±μ€ν μμ μλ‘ μκ°ν μ μμ΅λλ€: "μ§κΈ μμ μ€μΈκ°? (νΈμΆ μ€ν)" κ·Έλ¦¬κ³ "λ΄κ° ν΄μΌ ν μΌμ΄ κΈ°λ€λ¦¬κ³ μλκ°? (νμ€ν¬ ν)" μμ μκ° μ ν΄ μνμ΄κ³ (νΈμΆ μ€νμ΄ λΉμ΄ μμ) μμ μ΄ κΈ°λ€λ¦¬κ³ μλ€λ©΄ (νμ€ν¬ νκ° λΉμ΄ μμ§ μμ), μμ μλ λ€μ μμ μ μ§μ΄ λ€μ΄ μμν©λλ€.
λ³Έμ§μ μΌλ‘ μ΄λ²€νΈ 루νλ μλ°μ€ν¬λ¦½νΈκ° λ ΌλΈλ‘νΉ μμ μ μνν μ μκ² νλ μμ§μ λλ€. μ΄κ²μ΄ μλ€λ©΄ μλ°μ€ν¬λ¦½νΈλ μ½λλ₯Ό μμ°¨μ μΌλ‘ μ€ννλ λ° μ νλμ΄, νΉν I/O μμ , μ¬μ©μ μνΈ μμ© λ° κΈ°ν λΉλκΈ° μ΄λ²€νΈλ₯Ό μ²λ¦¬νλ μΉ λΈλΌμ°μ λ° Node.js νκ²½μμ μ’μ§ μμ μ¬μ©μ κ²½νμ μ΄λν κ²μ λλ€.
νΈμΆ μ€ν: μ½λκ° μ€νλλ κ³³
νΈμΆ μ€νμ LIFO(Last-In, First-Out) μμΉμ λ°λ₯΄λ λ°μ΄ν° ꡬ쑰μ λλ€. μλ°μ€ν¬λ¦½νΈ μ½λκ° μ€μ λ‘ μ€νλλ κ³³μ λλ€. ν¨μκ° νΈμΆλλ©΄ νΈμΆ μ€νμ νΈμλ©λλ€. ν¨μκ° μ€νμ μλ£νλ©΄ μ€νμμ νλ©λλ€.
μ΄ κ°λ¨ν μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
function firstFunction() {
console.log('First function');
secondFunction();
}
function secondFunction() {
console.log('Second function');
}
firstFunction();
μ€ν μ€μ νΈμΆ μ€νμ λ€μκ³Ό κ°μ΄ 보μ λλ€:
- μ²μμλ νΈμΆ μ€νμ΄ λΉμ΄ μμ΅λλ€.
firstFunction()μ΄ νΈμΆλμ΄ μ€νμ νΈμλ©λλ€.firstFunction()λ΄μμconsole.log('First function')μ΄ μ€νλ©λλ€.secondFunction()μ΄ νΈμΆλμ΄ μ€νμ νΈμλ©λλ€ (firstFunction()μμ).secondFunction()λ΄μμconsole.log('Second function')μ΄ μ€νλ©λλ€.secondFunction()μ΄ μλ£λκ³ μ€νμμ νλ©λλ€.firstFunction()μ΄ μλ£λκ³ μ€νμμ νλ©λλ€.- μ΄μ νΈμΆ μ€νμ΄ λ€μ λΉμ΄ μμ΅λλ€.
ν¨μκ° μ¬λ°λ₯Έ μ’ λ£ μ‘°κ±΄ μμ΄ μμ μ μ¬κ·μ μΌλ‘ νΈμΆνλ©΄ μ€ν μ€λ²νλ‘ μ€λ₯κ° λ°μν μ μμ΅λλ€. μ΄ μ€λ₯λ νΈμΆ μ€νμ΄ μ΅λ ν¬κΈ°λ₯Ό μ΄κ³Όνμ¬ νλ‘κ·Έλ¨μ΄ μΆ©λν©λλ€.
νμ€ν¬ ν(μ½λ°± ν): λΉλκΈ° μμ μ²λ¦¬
νμ€ν¬ ν(μ½λ°± ν λλ λ§€ν¬λ‘νμ€ν¬ νλΌκ³ λ ν¨)λ μ΄λ²€νΈ 루νμμ μ²λ¦¬λκΈ°λ₯Ό κΈ°λ€λ¦¬λ μμ νμ λλ€. λ€μκ³Ό κ°μ λΉλκΈ° μμ μ μ²λ¦¬νλ λ° μ¬μ©λ©λλ€:
setTimeoutλ°setIntervalμ½λ°±- μ΄λ²€νΈ 리μ€λ (μ: ν΄λ¦ μ΄λ²€νΈ, ν€ μ λ ₯ μ΄λ²€νΈ)
XMLHttpRequest(XHR) λ°fetchμ½λ°± (λ€νΈμν¬ μμ²μ©)- μ¬μ©μ μνΈ μμ© μ΄λ²€νΈ
λΉλκΈ° μμ μ΄ μλ£λλ©΄ ν΄λΉ μ½λ°± ν¨μλ νμ€ν¬ νμ λ°°μΉλ©λλ€. κ·Έλ° λ€μ μ΄λ²€νΈ 루νλ μ΄ μ½λ°±λ€μ νλμ© κ°μ Έμ νΈμΆ μ€νμ΄ λΉμ΄ μμ λ νΈμΆ μ€νμμ μ€νν©λλ€.
setTimeout μμ λ‘ μ€λͺ
ν΄ λ³΄κ² μ΅λλ€:
console.log('Start');
setTimeout(() => {
console.log('Timeout callback');
}, 0);
console.log('End');
λ€μκ³Ό κ°μ μΆλ ₯μ μμν μ μμ΅λλ€:
Start
Timeout callback
End
κ·Έλ¬λ μ€μ μΆλ ₯μ λ€μκ³Ό κ°μ΅λλ€:
Start
End
Timeout callback
μ΄μ λ λ€μκ³Ό κ°μ΅λλ€:
console.log('Start')κ° μ€νλμ΄ "Start"λ₯Ό μΆλ ₯ν©λλ€.setTimeout(() => { ... }, 0)μ΄ νΈμΆλ©λλ€. μ§μ° μκ°μ΄ 0λ°λ¦¬μ΄λΌλ μ½λ°± ν¨μκ° μ¦μ μ€νλμ§λ μμ΅λλ€. λμ νμ€ν¬ νμ λ°°μΉλ©λλ€.console.log('End')κ° μ€νλμ΄ "End"λ₯Ό μΆλ ₯ν©λλ€.- μ΄μ νΈμΆ μ€νμ΄ λΉμ΄ μμ΅λλ€. μ΄λ²€νΈ 루νκ° νμ€ν¬ νλ₯Ό νμΈν©λλ€.
setTimeoutμ μ½λ°± ν¨μκ° νμ€ν¬ νμμ νΈμΆ μ€νμΌλ‘ μ΄λνμ¬ μ€νλλ©° "Timeout callback"μ μΆλ ₯ν©λλ€.
μ΄λ 0ms μ§μ° μκ°μλ setTimeout μ½λ°±μ νμ¬ λκΈ° μ½λ μ€νμ΄ μλ£λ νμ νμ λΉλκΈ°μ μΌλ‘ μ€νλ¨μ 보μ¬μ€λλ€.
λ§μ΄ν¬λ‘νμ€ν¬ ν: νμ€ν¬ νλ³΄λ€ μ°μ μμ λμ
λ§μ΄ν¬λ‘νμ€ν¬ νλ μ΄λ²€νΈ 루νμμ κ΄λ¦¬νλ λ λ€λ₯Έ νμ λλ€. μ΄λ νμ¬ νμ€ν¬κ° μλ£λ μ§ν, μ΄λ²€νΈ 루νκ° λ€μ λ λλ§νκ±°λ λ€λ₯Έ μ΄λ²€νΈλ₯Ό μ²λ¦¬νκΈ° μ μ κ°λ₯ν ν 빨리 μ€νλμ΄μΌ νλ μμ μ μν΄ μ€κ³λμμ΅λλ€. νμ€ν¬ νμ λΉν΄ μ°μ μμκ° λμ νλΌκ³ μκ°νλ©΄ λ©λλ€.
λ§μ΄ν¬λ‘νμ€ν¬μ μΌλ°μ μΈ μμ€λ λ€μκ³Ό κ°μ΅λλ€:
- Promise: Promiseμ
.then(),.catch(),.finally()μ½λ°±μ λ§μ΄ν¬λ‘νμ€ν¬ νμ μΆκ°λ©λλ€. - MutationObserver: DOM(Document Object Model)μ λ³κ²½ μ¬νμ κ΄μ°°νλ λ° μ¬μ©λ©λλ€. Mutation observer μ½λ°±λ λ§μ΄ν¬λ‘νμ€ν¬ νμ μΆκ°λ©λλ€.
process.nextTick()(Node.js): νμ¬ μμ μλ£ ν, μ΄λ²€νΈ 루νκ° κ³μλκΈ° μ μ μ½λ°±μ μ€ννλλ‘ μμ½ν©λλ€. κ°λ ₯νμ§λ§ κ³Όλνκ² μ¬μ©νλ©΄ I/O κΈ°μλ₯Ό μ λ°ν μ μμ΅λλ€.queueMicrotask()(λΉκ΅μ μλ‘μ΄ λΈλΌμ°μ API): λ§μ΄ν¬λ‘νμ€ν¬λ₯Ό νμ λ£λ νμ€νλ λ°©λ²μ λλ€.
νμ€ν¬ νμ λ§μ΄ν¬λ‘νμ€ν¬ νμ μ£Όμ μ°¨μ΄μ μ μ΄λ²€νΈ 루νκ° νμ€ν¬ νμμ λ€μ μμ μ κ°μ Έμ€κΈ° μ μ λ§μ΄ν¬λ‘νμ€ν¬ νμ λͺ¨λ μ¬μ© κ°λ₯ν λ§μ΄ν¬λ‘νμ€ν¬λ₯Ό μ²λ¦¬νλ€λ κ²μ λλ€. μ΄λ κ° νμ€ν¬ μλ£ ν λ§μ΄ν¬λ‘νμ€ν¬κ° μ¦μ μ€νλλλ‘ λ³΄μ₯νμ¬ μ μ¬μ μΈ μ§μ°μ μ΅μννκ³ μλ΅μ±μ κ°μ ν©λλ€.
Promiseμ setTimeoutμ΄ κ΄λ ¨λ μ΄ μμ λ₯Ό κ³ λ €ν΄ λ³΄κ² μ΅λλ€:
console.log('Start');
Promise.resolve().then(() => {
console.log('Promise callback');
});
setTimeout(() => {
console.log('Timeout callback');
}, 0);
console.log('End');
μΆλ ₯μ λ€μκ³Ό κ°μ΅λλ€:
Start
End
Promise callback
Timeout callback
μ¬κΈ°μμ μ€λͺ μ λ€μκ³Ό κ°μ΅λλ€:
console.log('Start')κ° μ€νλ©λλ€.Promise.resolve().then(() => { ... })λ ν΄κ²°λ Promiseλ₯Ό μμ±ν©λλ€..then()μ½λ°±μ λ§μ΄ν¬λ‘νμ€ν¬ νμ μΆκ°λ©λλ€.setTimeout(() => { ... }, 0)μ ν΄λΉ μ½λ°±μ νμ€ν¬ νμ μΆκ°ν©λλ€.console.log('End')κ° μ€νλ©λλ€.- νΈμΆ μ€νμ΄ λΉμ΄ μμ΅λλ€. μ΄λ²€νΈ 루νκ° λ¨Όμ λ§μ΄ν¬λ‘νμ€ν¬ νλ₯Ό νμΈν©λλ€.
- Promise μ½λ°±μ΄ λ§μ΄ν¬λ‘νμ€ν¬ νμμ νΈμΆ μ€νμΌλ‘ μ΄λνμ¬ μ€νλλ©° "Promise callback"μ μΆλ ₯ν©λλ€.
- μ΄μ λ§μ΄ν¬λ‘νμ€ν¬ νκ° λΉμ΄ μμ΅λλ€. μ΄λ²€νΈ 루νκ° νμ€ν¬ νλ₯Ό νμΈν©λλ€.
setTimeoutμ½λ°±μ΄ νμ€ν¬ νμμ νΈμΆ μ€νμΌλ‘ μ΄λνμ¬ μ€νλλ©° "Timeout callback"μ μΆλ ₯ν©λλ€.
μ΄ μμ λ setTimeout μ§μ° μκ°μ΄ 0μ΄μ΄λ λ§μ΄ν¬λ‘νμ€ν¬(Promise μ½λ°±)κ° νμ€ν¬(setTimeout μ½λ°±)λ³΄λ€ λ¨Όμ μ€νλ¨μ λͺ
ννκ² λ³΄μ¬μ€λλ€.
μ°μ μμμ μ€μμ±: λ§μ΄ν¬λ‘νμ€ν¬ λ νμ€ν¬
λ§μ΄ν¬λ‘νμ€ν¬μ λν νμ€ν¬μ μ°μ μμλ λ°μμ±μ΄ μ’μ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό μ μ§νλ λ° μ€μν©λλ€. λ§μ΄ν¬λ‘νμ€ν¬λ μ’ μ’ DOMμ μ λ°μ΄νΈνκ±°λ μ€μν λ°μ΄ν° λ³κ²½μ μ²λ¦¬νκΈ° μν΄ κ°λ₯ν ν 빨리 μ€νλμ΄μΌ νλ μμ μ ν¬ν¨ν©λλ€. νμ€ν¬λ₯Ό μ²λ¦¬νκΈ° μ μ λ§μ΄ν¬λ‘νμ€ν¬λ₯Ό μ²λ¦¬ν¨μΌλ‘μ¨ λΈλΌμ°μ λ μ΄λ¬ν μ λ°μ΄νΈκ° μ μνκ² λ°μλλλ‘ λ³΄μ₯νμ¬ μ ν리μΌμ΄μ μ μΈμ§λ μ±λ₯μ ν₯μμν΅λλ€.
μλ₯Ό λ€μ΄, μλ²μμ λ°μ λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ UIλ₯Ό μ
λ°μ΄νΈνλ μν©μ μμν΄ λ³΄μΈμ. Promise(λ§μ΄ν¬λ‘νμ€ν¬ νλ₯Ό μ¬μ©νλ)λ₯Ό μ¬μ©νμ¬ λ°μ΄ν° μ²λ¦¬ λ° UI μ
λ°μ΄νΈλ₯Ό μ²λ¦¬νλ©΄ λ³κ²½ μ¬νμ΄ μ μνκ² μ μ©λμ΄ λ λΆλλ¬μ΄ μ¬μ©μ κ²½νμ μ 곡ν©λλ€. μ΄λ¬ν μ
λ°μ΄νΈμ setTimeout(νμ€ν¬ νλ₯Ό μ¬μ©νλ)μ μ¬μ©νλ©΄ λμ λλ μ§μ°μ΄ λ°μνμ¬ λ λ°μμ μΈ μ ν리μΌμ΄μ
μ μ΄λν μ μμ΅λλ€.
κΈ°μ: λ§μ΄ν¬λ‘νμ€ν¬κ° μ΄λ²€νΈ 루νλ₯Ό μ°¨λ¨ν λ
λ§μ΄ν¬λ‘νμ€ν¬ νλ μλ΅μ±μ κ°μ νλλ‘ μ€κ³λμμ§λ§ μ μ€νκ² μ¬μ©ν΄μΌ ν©λλ€. μ΄λ²€νΈ 루νκ° νμ€ν¬ νλ‘ μ΄λνκ±°λ μ λ°μ΄νΈλ₯Ό λ λλ§νλ κ²μ νμ©νμ§ μκ³ μ§μμ μΌλ‘ λ§μ΄ν¬λ‘νμ€ν¬λ₯Ό νμ μΆκ°νλ©΄ κΈ°μλ₯Ό μ λ°ν μ μμ΅λλ€. μ΄λ λ§μ΄ν¬λ‘νμ€ν¬ νκ° λΉμμ§μ§ μμ μ΄λ²€νΈ 루νλ₯Ό ν¨κ³Όμ μΌλ‘ μ°¨λ¨νκ³ λ€λ₯Έ μμ μ΄ μ€νλμ§ λͺ»νκ² ν λ λ°μν©λλ€.
μ΄ μμ λ₯Ό κ³ λ €ν΄ λ³΄μΈμ (μ£Όλ‘ Node.jsμ κ°μ΄ process.nextTickμ μ¬μ©ν μ μλ νκ²½μ κ΄λ ¨λμ§λ§ κ°λ
μ μΌλ‘ λ€λ₯Έ κ³³μμλ μ μ© κ°λ₯):
function starve() {
Promise.resolve().then(() => {
console.log('Microtask executed');
starve(); // μ¬κ·μ μΌλ‘ λ€λ₯Έ λ§μ΄ν¬λ‘νμ€ν¬ μΆκ°
});
}
starve();
μ΄ μμ μμ starve() ν¨μλ μ§μμ μΌλ‘ μλ‘μ΄ Promise μ½λ°±μ λ§μ΄ν¬λ‘νμ€ν¬ νμ μΆκ°ν©λλ€. μ΄λ²€νΈ 루νλ μ΄λ¬ν λ§μ΄ν¬λ‘νμ€ν¬λ₯Ό 무기ν μ²λ¦¬νλ λ° κ°ν λ€λ₯Έ μμ
μ΄ μ€νλμ§ λͺ»νκ² νμ¬ μ ν리μΌμ΄μ
μ΄ λ©μΆ μ μμ΅λλ€.
κΈ°μ λ°©μ§λ₯Ό μν λͺ¨λ² μ¬λ‘:
- λ¨μΌ νμ€ν¬ λ΄μμ μμ±λλ λ§μ΄ν¬λ‘νμ€ν¬ μλ₯Ό μ νν©λλ€. μ΄λ²€νΈ 루νλ₯Ό μ°¨λ¨ν μ μλ λ§μ΄ν¬λ‘νμ€ν¬μ μ¬κ· 루ν μμ±μ νΌν©λλ€.
- λ μ€μν μμ
μ κ²½μ°
setTimeoutμ¬μ©μ κ³ λ €ν©λλ€. μ¦κ°μ μΈ μ€νμ΄ νμνμ§ μμ μμ μ νμ€ν¬ νλ‘ μ°κΈ°νλ©΄ λ§μ΄ν¬λ‘νμ€ν¬ νκ° κ³ΌλΆνλλ κ²μ λ°©μ§ν μ μμ΅λλ€. - λ§μ΄ν¬λ‘νμ€ν¬μ μ±λ₯ μν₯μ μΌλμ λ‘λλ€. λ§μ΄ν¬λ‘νμ€ν¬λ μΌλ°μ μΌλ‘ νμ€ν¬λ³΄λ€ λΉ λ₯΄μ§λ§ κ³Όλνκ² μ¬μ©νλ©΄ μ¬μ ν μ ν리μΌμ΄μ μ±λ₯μ μν₯μ μ€ μ μμ΅λλ€.
μ€μ μμ λ° μ¬μ© μ¬λ‘
μμ 1: Promiseλ₯Ό μ¬μ©ν λΉλκΈ° μ΄λ―Έμ§ λ‘λ©
function loadImage(url) {
return new Promise((resolve, reject) => {
const img = new Image();
img.onload = () => resolve(img);
img.onerror = () => reject(new Error(`Failed to load image at ${url}`));
img.src = url;
});
}
// μμ μ¬μ©:
loadImage('https://example.com/image.jpg')
.then(img => {
// μ΄λ―Έμ§ λ‘λ μ±κ³΅. DOM μ
λ°μ΄νΈ.
document.body.appendChild(img);
})
.catch(error => {
// μ΄λ―Έμ§ λ‘λ μ€λ₯ μ²λ¦¬.
console.error(error);
});
μ΄ μμ μμ loadImage ν¨μλ μ΄λ―Έμ§κ° μ±κ³΅μ μΌλ‘ λ‘λλλ©΄ ν΄κ²°λκ±°λ μ€λ₯κ° λ°μνλ©΄ κ±°λΆλλ Promiseλ₯Ό λ°νν©λλ€. .then() λ° .catch() μ½λ°±μ λ§μ΄ν¬λ‘νμ€ν¬ νμ μΆκ°λμ΄ μ΄λ―Έμ§ λ‘λ© μμ
μ΄ μλ£λ ν DOM μ
λ°μ΄νΈ λ° μ€λ₯ μ²λ¦¬κ° μ¦μ μ€νλλλ‘ λ³΄μ₯ν©λλ€.
μμ 2: λμ UI μ λ°μ΄νΈλ₯Ό μν MutationObserver μ¬μ©
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
console.log('Mutation observed:', mutation);
// λ³κ²½ μ¬νμ λ°λΌ UI μ
λ°μ΄νΈ.
});
});
const elementToObserve = document.getElementById('myElement');
observer.observe(elementToObserve, {
attributes: true,
childList: true,
subtree: true
});
// λμ€μ μμλ₯Ό μμ :
elementToObserve.textContent = 'New content!';
MutationObserverλ₯Ό μ¬μ©νλ©΄ DOM λ³κ²½ μ¬νμ λͺ¨λν°λ§ν μ μμ΅λλ€. λ³κ²½ μ¬ν(μ: μμ± λ³κ²½, μμ λ
Έλ μΆκ°)μ΄ λ°μνλ©΄ MutationObserver μ½λ°±μ΄ λ§μ΄ν¬λ‘νμ€ν¬ νμ μΆκ°λ©λλ€. μ΄λ₯Ό ν΅ν΄ DOM λ³κ²½μ λν μλ΅μΌλ‘ UIκ° μ μνκ² μ
λ°μ΄νΈλλλ‘ λ³΄μ₯ν©λλ€.
μμ 3: Fetch APIλ₯Ό μ¬μ©ν λ€νΈμν¬ μμ² μ²λ¦¬
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
console.log('Data received:', data);
// λ°μ΄ν° μ²λ¦¬ λ° UI μ
λ°μ΄νΈ.
})
.catch(error => {
console.error('Error fetching data:', error);
// μ€λ₯ μ²λ¦¬.
});
Fetch APIλ μλ°μ€ν¬λ¦½νΈμμ λ€νΈμν¬ μμ²μ νλ νλμ μΈ λ°©λ²μ
λλ€. .then() μ½λ°±μ λ§μ΄ν¬λ‘νμ€ν¬ νμ μΆκ°λμ΄ μλ΅μ΄ μμ λλ μ¦μ λ°μ΄ν° μ²λ¦¬ λ° UI μ
λ°μ΄νΈκ° μ€νλλλ‘ λ³΄μ₯ν©λλ€.
Node.js μ΄λ²€νΈ 루ν κ³ λ € μ¬ν
Node.jsμ μ΄λ²€νΈ 루νλ λΈλΌμ°μ νκ²½κ³Ό μ μ¬νκ² μλνμ§λ§ λͺ κ°μ§ νΉμ κΈ°λ₯μ΄ μμ΅λλ€. Node.jsλ libuv λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ©°, μ΄ λΌμ΄λΈλ¬λ¦¬λ μ΄λ²€νΈ 루ν ꡬνκ³Ό λΉλκΈ° I/O κΈ°λ₯μ μ 곡ν©λλ€.
process.nextTick(): μμ μΈκΈνλ―μ΄ process.nextTick()μ Node.js νΉμ ν¨μλ‘, νμ¬ μμ
μ΄ μλ£λ ν μ΄λ²€νΈ 루νκ° κ³μλκΈ° μ μ μ½λ°±μ μ€ννλλ‘ μμ½ν μ μμ΅λλ€. process.nextTick()μΌλ‘ μΆκ°λ μ½λ°±μ λ§μ΄ν¬λ‘νμ€ν¬ νμ Promise μ½λ°±λ³΄λ€ λ¨Όμ μ€νλ©λλ€. κ·Έλ¬λ κΈ°μ κ°λ₯μ± λλ¬Έμ process.nextTick()μ μ μ€νκ² μ¬μ©ν΄μΌ ν©λλ€. κ°λ₯ν κ²½μ° queueMicrotask()κ° μΌλ°μ μΌλ‘ μ νΈλ©λλ€.
setImmediate(): setImmediate() ν¨μλ μ΄λ²€νΈ 루νμ λ€μ λ°λ³΅μμ μ½λ°±μ μ€ννλλ‘ μμ½ν©λλ€. μ΄λ setTimeout(() => { ... }, 0)κ³Ό μ μ¬νμ§λ§ setImmediate()λ I/O κ΄λ ¨ μμ
μ μν΄ μ€κ³λμμ΅λλ€. setImmediate()μ setTimeout(() => { ... }, 0) κ°μ μ€ν μμλ μμΈ‘ν μ μμΌλ©° μμ€ν
μ I/O μ±λ₯μ λ°λΌ λ¬λΌμ§λλ€.
ν¨μ¨μ μΈ μ΄λ²€νΈ 루ν κ΄λ¦¬λ₯Ό μν λͺ¨λ² μ¬λ‘
- λ©μΈ μ€λ λλ₯Ό μ°¨λ¨νμ§ λ§μμμ€. μ€λ μ€νλλ λκΈ° μμ μ μ΄λ²€νΈ 루νλ₯Ό μ°¨λ¨νμ¬ μ ν리μΌμ΄μ μλ΅μ±μ λ¨μ΄λ¨λ¦΄ μ μμ΅λλ€. κ°λ₯ν ν λΉλκΈ° μμ μ μ¬μ©νμμμ€.
- μ½λλ₯Ό μ΅μ ννμμμ€. ν¨μ¨μ μΈ μ½λλ λ λΉ λ₯΄κ² μ€νλμ΄ νΈμΆ μ€νμμ 보λ΄λ μκ°μ μ€μ΄κ³ μ΄λ²€νΈ 루νκ° λ λ§μ μμ μ μ²λ¦¬ν μ μλλ‘ ν©λλ€.
- λΉλκΈ° μμ μ μν΄ Promiseλ₯Ό μ¬μ©νμμμ€. Promiseλ μ ν΅μ μΈ μ½λ°±μ λΉν΄ λΉλκΈ° μ½λλ₯Ό λ κΉλνκ³ κ΄λ¦¬νκΈ° μ¬μ΄ λ°©λ²μ μ 곡ν©λλ€.
- λ§μ΄ν¬λ‘νμ€ν¬ νμ μ£Όμνμμμ€. κΈ°μλ₯Ό μ λ°ν μ μλ κ³Όλν λ§μ΄ν¬λ‘νμ€ν¬ μμ±μ νΌνμμμ€.
- κ³μ° μ§μ½μ μΈ μμ μ μν΄ Web Workerλ₯Ό μ¬μ©νμμμ€. Web Workerλ λ³λμ μ€λ λμμ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ€ννμ¬ λ©μΈ μ€λ λκ° μ°¨λ¨λλ κ²μ λ°©μ§ν©λλ€. (λΈλΌμ°μ νκ²½ νΉμ )
- μ½λλ₯Ό νλ‘νμΌλ§νμμμ€. λΈλΌμ°μ κ°λ°μ λꡬλ Node.js νλ‘νμΌλ§ λꡬλ₯Ό μ¬μ©νμ¬ μ±λ₯ λ³λͺ© νμμ νμ νκ³ μ½λλ₯Ό μ΅μ ννμμμ€.
- μ΄λ²€νΈλ₯Ό λλ°μ΄μ€(debounce) λ° μ€λ‘ν(throttle)νμμμ€. μμ£Ό λ°μνλ μ΄λ²€νΈ(μ: μ€ν¬λ‘€ μ΄λ²€νΈ, 리μ¬μ΄μ¦ μ΄λ²€νΈ)μ κ²½μ° λλ°μ΄μ± λλ μ€λ‘νλ§μ μ¬μ©νμ¬ μ΄λ²€νΈ νΈλ€λ¬ μ€ν νμλ₯Ό μ ννμμμ€. μ΄λ μ΄λ²€νΈ 루νμ λΆνλ₯Ό μ€μ¬ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
κ²°λ‘
μλ°μ€ν¬λ¦½νΈ μ΄λ²€νΈ 루ν, νμ€ν¬ ν, λ§μ΄ν¬λ‘νμ€ν¬ νλ₯Ό μ΄ν΄νλ κ²μ μ±λ₯μ΄ λ°μ΄λκ³ λ°μμ±μ΄ μ’μ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ μμ±νλ λ° νμμ μ λλ€. μ΄λ²€νΈ 루νκ° μ΄λ»κ² μλνλμ§ μ΄ν΄ν¨μΌλ‘μ¨ λΉλκΈ° μμ μ μ²λ¦¬νλ λ°©λ²μ λν΄ μ 보μ μ κ°ν κ²°μ μ λ΄λ¦¬κ³ λ λμ μ±λ₯μ μν΄ μ½λλ₯Ό μ΅μ νν μ μμ΅λλ€. λ§μ΄ν¬λ‘νμ€ν¬λ₯Ό μ μ νκ² μ°μ μμ μ§μ νκ³ , κΈ°μλ₯Ό νΌνλ©°, νμ λ©μΈ μ€λ λλ₯Ό μ°¨λ¨ μμ μΌλ‘λΆν° μμ λ‘κ² μ μ§νκΈ° μν΄ λ Έλ ₯νμμμ€.
μ΄ κ°μ΄λμμλ μλ°μ€ν¬λ¦½νΈ μ΄λ²€νΈ 루νμ λν ν¬κ΄μ μΈ κ°μλ₯Ό μ 곡νμ΅λλ€. μ¬κΈ°μ μ€λͺ λ μ§μκ³Ό λͺ¨λ² μ¬λ‘λ₯Ό μ μ©νλ©΄ νλ₯ν μ¬μ©μ κ²½νμ μ 곡νλ κ°λ ₯νκ³ ν¨μ¨μ μΈ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€.